// Package response
// Title  response.utils.go
// Description  统一返回值包
// Author  alittlexincan@163.com  2024/07/22 11:36
// update  alittlexincan@163.com  2024/07/22 11:36
package response

import (
	"errors"
	"net/http"

	"go.uber.org/zap"
	"xincan.com.cn/tarot-go-framework/global"
)

// 优先使用http包下的状态码

const (
	//SuccessCode = 4000 // 业务状态码
	//ErrorCode   = 5000 // 业务状态码

	SuccessMessage = "操作成功" // 成功返回信息
	ErrorMessage   = "操作失败" // 失败返回信息
)

// SuccessResult
// Title    		统一返回成功结构体
// Description   	统一返回成功结构体
// Auth      		alittlexincan@163.com         时间（2024/07/22 11:36）
type SuccessResult struct {
	// 响应编码
	Code int `json:"code,omitempty" example:"200"`
	// 响应信息
	Message string `json:"message,omitempty" example:"操作成功"`
	// 返回数据
	Data interface{} `json:"data,omitempty" example:{}`
}

// ErrorResult
// Title    		统一返回失败结构体
// Description   	统一返回失败结构体
// Auth      		alittlexincan@163.com         时间（2024/07/22 11:36）
type ErrorResult struct {
	// 响应编码
	Code int `json:"code,omitempty"`
	// 响应信息
	Message string `json:"message,omitempty" example:"操作失败"`
	// 返回数据
	Data interface{} `json:"data,omitempty"`
}

// Title    		编码解析函数
// Description   	application/json编码解析函数
// Auth      		alittlexincan@163.com         		"时间（2024/07/22 11:36）"
// Param    		err     				error    	"异常对象"
// Return    		message        			string     	"返回消息说明"
func message(err error) string {
	if err != nil {
		return ErrorMessage + ": " + err.Error()
	}
	return SuccessMessage
}

// Success
// Title    		统一返回成功信息日志记录函数
// Description   	统一返回成功信息日志记录函数
// Auth      		alittlexincan@163.com         				"时间（2024/07/22 11:36）"
// Param    		data        			interface{}     	"结果对象"
// Return    		*SuccessResult     							"返回结果对象"
func Success(data interface{}) *SuccessResult {
	return &SuccessResult{http.StatusOK, message(nil), data}
}

// Errors
// Title    		统一返回错误信息日志记录函数
// Description   	统一返回错误信息日志记录函数
// Auth      		alittlexincan@163.com         				"时间（2024/07/22 11:36）"
// Param    		err     				error    			"异常对象"
// Param    		data        			interface{}     	"结果对象"
// Return    		*SuccessResult     							"返回结果对象"
func Errors(err error, data interface{}) *ErrorResult {
	var myErr *ErrorResult
	if errors.As(err, &myErr) {
		//return LogErrors(myErr.Code, myErr.Message, data)
		return &ErrorResult{myErr.Code, myErr.Message, data}
	}
	//return LogErrors(http.StatusInternalServerError, err.Error(), data)
	return &ErrorResult{http.StatusInternalServerError, message(err), data}
}

// LogErrors
// Title    		统一错误信息日志记录函数
// Description   	统一错误信息日志记录函数
// Auth      		alittlexincan@163.com         				"时间（2024/07/22 11:36）"
// Param    		message     			string    			"异常对象"
// Param    		data        			interface{}     	"结果对象"
// Return    		*SuccessResult     							"返回结果对象"
//func LogErrors(code int, msg string, data interface{}) *ErrorResult {
//	var mapResult map[string]interface{}
//	err := errors.New(msg)
//	da, _ := json.Marshal(data)
//	_ = json.Unmarshal(da, &mapResult)
//	global.Logger.Error("出现异常：", zap.Int("code", code), zap.Error(err), zap.Any("data", data))
//	return &ErrorResult{code, message(err), data}
//}

// NewError
// Title    		统一返回错误信息日志记录函数
// Description   	自定义错误, 统一返回错误信息日志记录函数
// Auth      		alittlexincan@163.com         				"时间（2024/07/22 11:36）"
// Param    		err     				error    			"异常对象"
// Param    		data        			interface{}     	"结果对象"
// Return    		*SuccessResult     							"返回结果对象"
func NewError(code int, message string) error {
	global.Logger.Error("出现异常1：", zap.Int("code", code), zap.Error(errors.New(message)), zap.Any("data", nil))
	return &ErrorResult{
		Code:    code,
		Message: message,
	}
}

// Error
// Title    		统一返回错误信息日志记录函数
// Description   	自定义错误, 实现并重写语言内置的error, 统一返回错误信息日志记录函数
// Auth      		alittlexincan@163.com         				"时间（2024/07/22 11:36）"
// Param    		err     				error    			"异常对象"
// Param    		data        			interface{}     	"结果对象"
// Return    		*SuccessResult     							"返回结果对象"
func (than *ErrorResult) Error() string {
	return than.Message
}
